home *** CD-ROM | disk | FTP | other *** search
/ Die ultimative Songtext / SONGTEXTE VOL. 1.ISO / MUSIK TOOLZ / abc2tab / ABC2TAB.PL < prev    next >
Perl Script  |  1998-03-21  |  36KB  |  937 lines

  1. #!/usr/local/bin/perl
  2.  
  3. $Version = "1.1";
  4. printf "ABC2Tab Version $Version, Copyright (C) 1998  Lyle Melick\n";
  5.  
  6. ############################################################################
  7. #
  8. # abc2tab: Program to convert tunes in abc format to ASCII Tablature.
  9. # Copyright (C) 1998  Lyle Melick
  10. #
  11. # This program is free software; you can redistribute it and/or modify
  12. # it under the terms of the GNU General Public License as published by
  13. # the Free Software Foundation; either version 2 of the License, or
  14. # (at your option) any later version.
  15. #
  16. # This program is distributed in the hope that it will be useful,
  17. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19. # GNU General Public License for more details.
  20. #
  21. # You should have received a copy of the GNU General Public License
  22. # along with this program; if not, write to the Free Software
  23. # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24. #
  25. # The author can be contacted as follows:
  26. #
  27. # Lyle Melick
  28. # melick@centuryinter.net
  29. #
  30. ############################################################################
  31.  
  32. # #-----
  33. #
  34. # parse command line
  35. #
  36. #-----
  37. print "ARGV = ", join(" ", @ARGV), "\n" if $verbose;
  38. &Getopts('d:u:x:fghsv');
  39. if ($opt_h || $opt_err) {
  40.     print "Usage: $0 [-d[#]] [-f] [-g] [-h] [-s] [-u[#]] [-v] [-x[xref]] [abcfile.abc]\n";
  41.     print " -d -- adjust DOWN by this many octaves (Example: -d1)\n";
  42.     print " -f -- suppress footer annotations\n";
  43.     print " -g -- guitar style tab (High string on top)\n";
  44.     print " -h -- print this help\n";
  45.     print " -s -- suppress interline spaces, add column for spaces in source\n";
  46.     print " -u -- adjust UP by this many octaves (Example: -u1)\n";
  47.     print " -v -- verbose\n";
  48.     print " -x -- single x reference to print\n";
  49.     exit 0;
  50. }
  51.  
  52. $Footers = 1;
  53. $Footers = 0 if $opt_f;
  54. $GuitarTab = 0;
  55. $GuitarTab = 1 if $opt_g;
  56. $Melody_Only = 0;
  57. $Melody_Only = 1 if $opt_m;
  58. $Spaces = 1;
  59. $Spaces = 0 if $opt_s;
  60. $verbose = 0;
  61. $verbose = 1 if $opt_v;
  62. $Xref_List = $opt_x if ($opt_x ne "");
  63. printf "\tVERBOSE:Footers=%s,GuitarTab=%s,Melody_Only=%s,RegKey=%s,verbose=%s,Xref_List=%s\n", $Footers, $GuitarTab, $Melody_Only, $opt_r, $verbose, $Xref_List if $verbose;
  64.  
  65. #-----
  66. #
  67. # Setup
  68. #
  69. #-----
  70. printf "\tVERBOSE:Initializing\n" if $verbose;
  71.  
  72. $NoteXlt = ('CDEFGABcdefgab zZ');
  73. @NoteNum = ('40','42','44','45','47','49','51','52','54','56','57','59','61','63',' ','99','99');
  74. @Frets = ('-0-','-%-','-1-','-1%','-2-','-3-','-3%','-4-','-4%','-5-','-6-','-6%','-7-','-7%','-8-','-8%','-9-','-10','10%','-11','11%','-12','-13','13%','-14') if !$GuitarTab;
  75. @Frets = ('-0-','-1-','-2-','-3-','-4-','-5-','-6-','-7-','-8-','-9-','-10','-11','-12','-13','-14','-15','-16','-17','-18','-19','-20','-21','-22','-23','-24') if $GuitarTab;
  76.  
  77. @NoteLnth8  = (' t','dt',' s',' e',' q','dq',' h','5X','dh','7X',' w','  ');
  78. @NoteLnth16 = (' x','dx',' t',' s',' e','de',' q','5X','dq','7X',' h','  ');
  79.  
  80. $startabcline = 0;
  81. $endabcline = 0;
  82. $abcline = 0;
  83. $abcnote = 0;
  84.  
  85. printf "\tVERBOSE:All set...\n" if $verbose;
  86.  
  87. #-----
  88. #
  89. # Open the File
  90. #
  91. #-----
  92. printf "\tVERBOSE:Opening input file\n" if $verbose;
  93. open(FILE, "@ARGV") || die "Can't open file - @ARGV: $!\n";
  94.  
  95. #-----
  96. #
  97. # Begin Processing the file
  98. #
  99. #-----
  100. while (<FILE>) {
  101.     chop;
  102. # checking for and handling blank line between songs.
  103.     if ($_ eq "") {
  104.     if ($InSong eq "Yes") {
  105.         $endabcline = $abcline;
  106.         SWITCH: for ($X_Number) {
  107.         if ($X_Number == $Xref_List || $Xref_List == "") { &Process($startabcline,$endabcline); };
  108.         };
  109.         $startabcline = $endabcline + 1;
  110.         $InSong = "No";
  111.     } else {
  112.         next;
  113.     }
  114.     }
  115.     (@inline0) = split(/\!/, $_);
  116.     $inline0 = $inline0[0];
  117.     
  118.     (@inline1) = split(/\\/, $inline0);
  119.     $inline1 = $inline1[0];
  120.     
  121.     (@inline2) = split(/\*/, $inline1);
  122.     $inline2 = $inline2[0];
  123.     
  124.     (@inline) = split(/%/, $inline2);
  125.     $inline = $inline[0];
  126.     (@Field) = split(/\:/,$inline[0]);
  127.     (@RDef) = split(/\:/,$inline[2]);
  128.     if ($inline[0] eq "" && $inline[1] eq "" && $RDef[0] eq "ABC2TAB") {
  129.     printf "\tVERBOSE:$RDef[1], $RDef[2]\n" if $verbose;
  130.     &ReadDefinitions($RDef[1], $RDef[2]);
  131.     }
  132.     
  133. #--------------------
  134. #
  135. # Process Fields
  136. #
  137. #--------------------
  138.     if (length($Field[0]) eq 1) {
  139.     $InHistory = "No";
  140.     if (substr($Field[1],0,1) eq " ") {
  141.         $Field[1] = substr($Field[1],1,length($Field[1])-1);
  142.     }
  143.     
  144. #--------------------
  145. #
  146. # Handle fields
  147. #
  148. #--------------------
  149.     printf "\tVERBOSE:Parsing Header...\n" if $verbose;
  150.     SWITCH: for ($Field[0]) {
  151.         /[Aa]/ && do { $information[1]  = $Field[1]; last SWITCH; };
  152.         /[Bb]/ && do { $information[2]  = "From The Book $Field[1]"; last SWITCH; };
  153.         /[Cc]/ && do { $information[3]  = $Field[1]; last SWITCH; };
  154.         /[Dd]/ && do { $information[4]  = "Recorded on $Field[1]"; last SWITCH; };
  155.         /[Ee]/ && do { $information[5]  = "Elemskip = $Field[1]"; last SWITCH; };
  156.         /[Ff]/ && do { $information[6]  = "Processed from File $Field[1]"; last SWITCH; };
  157.         /[Gg]/ && do { $information[7]  = "Group: $Field[1]"; last SWITCH; };
  158.         /[Hh]/ && do { $information[8]  = "History: $Field[1]"; $InHistory = "Yes"; last SWITCH; };
  159.         /[Ii]/ && do { $information[9]  = "Information: $Field[1]"; last SWITCH; };
  160.         /[Jj]/ && do { $information[10] = $Field[1]; last SWITCH; };
  161.         /[Kk]/ && do {
  162.                  if ($InHeader eq "No") {
  163.                  @part[$abcline+1] = "Key of $Field[1]";
  164.                  &SetKey($Field[1]);
  165.                  } else {
  166.                  printf OUT "\tKey of %s                                                   %s\n\n       ", $Field[1], $information[3];
  167.                  &SetKey($Field[1]);
  168.                  if ($HaveStringDef eq "No") {
  169.                      $RDef[1] = "D A d";
  170.                      $RDef[2] = "Default Dulcimer Tuning";
  171.                      &ReadDefinitions($RDef[1],$RDef[2]);
  172.                  }
  173.                  if ($HaveTimeSig eq "No") {
  174.                      $TimeSig[0] = 4;
  175.                      $TimeSig[1] = 4;
  176.                  }
  177.                  $InHeader = "No";
  178.                  printf "\tVERBOSE:Header complete, starting notes\n" if $verbose;
  179.                  }
  180.                  last SWITCH; 
  181.              };
  182.         /[Ll]/ && do {
  183.                  (@DefLnth) = split(/\//,$Field[1]);
  184.                  $DefNoteLnth = @DefLnth[1];
  185.                  $LnthExpl = 1;
  186.                  last SWITCH; 
  187.              };
  188.         /[Mm]/ && do {
  189.                  $HaveTimeSig = "Yes";
  190.                  (@TimeSig) = split(/\//,$Field[1]);
  191.                  if (@TimeSig[0] eq "C" || @TimeSig[0] eq "c") {
  192.                  $TimeSig[0] = 4;
  193.                  $TimeSig[1] = 4;
  194.                  }
  195.                  if (@TimeSig[0] eq "C|" || @TimeSig[0] eq "c|") {
  196.                  $TimeSig[0] = 2;
  197.                  $TimeSig[1] = 4;
  198.                  }
  199.                  if ($LnthExpl = 0) {
  200.                  if (($TimeSig[0] / $TimeSig[1]) >= .75) {
  201.                      $DefNoteLnth = 8;
  202.                  } else {
  203.                      $DefNoteLnth = 16;
  204.                  }
  205.                  }
  206.                  last SWITCH; 
  207.             };
  208.         /[Nn]/ && do { $information[14] = "Notes: $Field[1]"; last SWITCH; };
  209.         /[Oo]/ && do { $information[15] = "Origin: $Field[1]"; last SWITCH; };
  210.         /[Pp]/ && do {
  211.                 if ($InHeader eq "No") {
  212.                 @part[$abcline+1] = "($Field[1])";
  213.                 } else {
  214.                 printf OUT "\n\tPlay parts in following order: %s\n\n", $Field[1];
  215.                 }
  216.                 last SWITCH; 
  217.             };
  218.         /[Qq]/ && do { printf OUT "\t%s\n", $Field[1]; last SWITCH; };
  219.         /[Rr]/ && do { printf OUT "\t%s\n", $Field[1]; last SWITCH; };
  220.         /[Ss]/ && do { $information[19] = "Source: $Field[1]"; last SWITCH; };
  221.         /[Tt]/ && do {
  222.                 if ($NoTitle eq "TRUE") {
  223.                 $LnthTitle = length($Field[1]);
  224.                 printf OUT ' ' x (40 - ($LnthTitle / 2));
  225.                 printf OUT "%s\n\n     ", $Field[1];
  226.                 $NoTitle = "FALSE";
  227.                 } else {
  228.                 $LnthTitle = length($Field[1]);
  229.                 printf OUT ' ' x (35 - ($LnthTitle / 2));
  230.                 printf OUT "%s\n     ", $Field[1];
  231.                 }
  232.                 last SWITCH; 
  233.             };
  234.         /[Uu]/ && do { $information[21] = $Field[1]; last SWITCH; };
  235.         /[Vv]/ && do { $information[22] = "Voice: $Field[1]"; last SWITCH; };
  236.         /[Ww]/ && do { $information[23] = "Lyrics: $Field[1]"; last SWITCH; };
  237.         /[Xx]/ && do { 
  238.                 &Initialize();
  239.                 $X_Number = $Field[1];
  240.                 $information[24] = "Song #$Field[1]";
  241.